class Students :
    def __init__(self, name, age, sex, job) :
        self._name = name # 受保护的属性， 允许本身和子类进行访问
        self.__age = age # 私有属性 只仅类本身访问
        self.sex = sex #普通属性
        self.__job__ =job

    def _fun1(self) :
        print(f'姓名：{self._name}, 性别{self.sex}, 今年{self.__age}岁，做{self.__job__}工作的 受保护的方法')

    def __fun2(self) :
        print(f'<UNK>{self._name}, <UNK>{self.__age}<UNK>，做{self.__job__}工作的 私有方法')

    def fun(self) :
        print(f'<UNK>{self._name}, <UNK>{self.__age}<UNK>，做{self.__job__}工作的 <UNK> 普通方法')

    @property
    def age(self) :
        return self.__age

    @age.setter
    def age(self, age) :
        self.__age = age


stu = Students('张三', '12', '男','前端')
# 属性访问
print(stu.__job__)
print(stu._name)
# print(stu.__age) 私有成员仅供内部使用
print(stu.sex)

# 方法访问
stu._fun1()
# stu.__fun2()
# stu._Students__fun2() #过通这种方式可以访问，但是不建议， 因为双下划线是私有方法
stu.fun()

#展示了当前实例上的所有方法与属性
print(dir(stu))


# 通过 @property 方式可以让类去访问私有属性

print(stu.age,'===age')
stu.age = 20 # 要想修改age的值，需要。@age.setter
print(stu.age,'===age')
